package org.ithink.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

/**
 * 配置文件管理器
 * @author 孙博
 *
 */
public class ConfigManager {
  
  /**
   * 属性文件全名
   */
  private static final String FLIE_PATH = System.getProperty("user.dir") + File.separator + "Singleton.properties";
  
  /**
   * 属性文件对应的文件对象变量
   */
  private File m_file = null;
  
  /**
   * 属性文件的最后修改日期
   */
  private long m_lastModifiedTime = 0;
  
  /**
   * 属性文件对应的属性对象变量
   */
  private Properties m_props = null;
  
  /**
   * 本类存在的唯一的一个实例
   */
  private static ConfigManager m_instance = new ConfigManager();
  
  /**
   * 私有构造函数，用以保证外界无法直接实例化
   * @throws Exception 
   */
  private ConfigManager() {
    m_file = new File(FLIE_PATH);
    m_lastModifiedTime = m_file.lastModified();
    
    if(m_lastModifiedTime == 0){
      System.out.println(FLIE_PATH + "文件不存在！");
      return;
    }
    
    m_props = new Properties();
    try {
      m_props.load(new FileInputStream(m_file));
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  
  /**
   * 返回唯一实例
   * @return
   */
  synchronized public static ConfigManager getInstance(){
    return m_instance;
  }
  
  /**
   * 取其中一个属性值
   * @param name：属性名
   * @param defaultVal：默认值
   * @return
   */
  final public Object getConfigItem(String name, Object defaultVal){
    long newTime = m_file.lastModified();
    
    // 如果没有修改时间，那就是文件不存在
    if(newTime == 0){
      if(m_lastModifiedTime == 0){
        System.out.println("文件不存在！");
      } else {
        System.out.println("文件已被删除！");
      }
      return defaultVal;
    }
    
    // 如果新修改日期大于老的修改日期，需要重新加载
    if(newTime > m_lastModifiedTime){
      m_props.clear();
      try {
        m_props.load(new FileInputStream(m_file));
      } catch (FileNotFoundException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    
    m_lastModifiedTime = newTime;
    
    Object val = m_props.getProperty(name);
    if(val == null){
      return defaultVal;
    } else {
      return val;
    }
  }
  
  public static void main(String[] args) {
    
  }
}
